home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ For TASM / USRGUIDE.PAK / SOMESTR.ASM < prev    next >
Assembly Source File  |  1996-02-21  |  4KB  |  89 lines

  1. ; Turbo Assembler example. Copyright (c) 1993 By Borland International, Inc.
  2. ;
  3. ; SOMESTR.ASM
  4. ;
  5. ; Usage: Run tasm on this file and link with somestr.pas
  6.  
  7. DATA      SEGMENT PUBLIC
  8.           EXTRN prefixSeg : WORD  ;gives location of PSP
  9. DATA      ENDS
  10. CODE      SEGMENT PUBLIC
  11.           ASSUME cs:CODE,ds:DATA
  12.  
  13. EnvString PROC FAR
  14.           PUBLIC  EnvString
  15.           push    bp
  16.           cld                     ;work upward
  17.           mov     es,[prefixSeg]  ;look at PSP
  18.           mov     es,es:[2Ch]     ;ES:DI points at environment
  19.           xor     di,di           ;which is paragraph-aligned
  20.           mov     bp,sp           ;find the parameter address
  21.           lds     si,ss:[bp+6]    ;which is right above the
  22.                                   ; return address
  23.           ASSUME  ds:NOTHING
  24.           lodsb                   ;look at length
  25.           or      al,al           ;is it zero?
  26.           jz      RetNul          ;if so, return
  27.           mov     ah,al           ;otherwise, save in AH
  28.           mov     dx,si           ;DS:DX contains pointer
  29.                                   ; to first parm char
  30.           xor     al,al           ;make a zero
  31. Compare:
  32.           mov     ch,al           ;we want ch=0 for next count, if any
  33.           mov     si,dx           ;get back pointer to string sought
  34.           mov     cl,ah           ;get length
  35.           mov     si,dx           ;get pointer to string sought
  36.           repe    cmpsb           ;compare bytes
  37.           jne     Skip            ;if fails, try next string
  38.           cmp     byte ptr es:[di],'='
  39.                                   ;compare succeeded; is next
  40.                                   ; char '='?
  41.           jne     NoEqual         ;if not, still no match
  42. Found:
  43.           mov     ax,es           ;make DS:SI point to string
  44.                                   ; we found
  45.           mov     ds,ax
  46.           mov     si,di
  47.           inc     si              ;get past the equal (=) sign
  48.           les     bx,ss:[bp+10]   ;get address of function result
  49.           mov     di,bx           ;put it in ES:DI
  50.           inc     di              ;get past the length byte
  51.           mov     cl,255          ;set up a maximum length
  52. CopyLoop:
  53.           lodsb                   ;get a byte
  54.           or      al,al           ;zero test
  55.           jz      Done            ;if zero, we're done
  56.           stosb                   ;put it in the result
  57.           loop    CopyLoop        ;move up to 255 bytes
  58. Done:     not     cl              ;we've been decrementing CL
  59.                                   ; from 255 during save
  60.           mov     es:[bx],cl      ;save the length
  61.           mov     ax,SEG DATA
  62.           mov     ds,ax           ;restore DS
  63.           ASSUME  ds:DATA
  64.           pop     bp
  65.           ret     4
  66.           ASSUME  ds:NOTHING
  67. Skip:
  68.           dec     di              ;check for null from this
  69.                                   ; character on
  70. NoEqual:
  71.           mov     cx,7FFFh        ;search a long way if necessary
  72.           sub     cx,di           ;environment never >32K
  73.           jbe     RetNul          ;if we're past end, leave
  74.           repne   scasb           ;look for the next null
  75.           jcxz    RetNul               ;exit if not found
  76.           cmp     byte ptr es:[di],al  ;second null in a row?
  77.           jne     Compare              ;if not, try again
  78. RetNul:
  79.           les     di,ss:[bp+10]   ;get address of result
  80.           stosb                   ;store a zero there
  81.           mov     ax,SEG DATA
  82.           mov     ds,ax           ;restore DS
  83.           ASSUME  ds:DATA
  84.           pop     bp
  85.           ret     4
  86. EnvString ENDP
  87. CODE      ENDS
  88.           END
  89.